沒空寫屁話了
上一篇講了 C# 該如何取得 Neo4j 資料的方法
分成 Write、Read、Begin 三種模式
那它們回傳的資料又會有幾種不同的變化呢
這篇就讓我來稍微示範一下吧,總共分成
本篇將使用從最開始就使用到現在的"資料庫類型"資料庫
好啦,也不是 FreeStyle 啦,就是回傳 Property
的資料啦
第八篇的時候有提過,Property
包含五種類型
其中長得比較雞巴 " 空間座標 " 我們之後再做一篇獨立講
首先回憶上一篇的內容
string sql = $"MATCH (n:Greeting{{message:'{message}'}}) RETURN n.message + ' from node : '+ id(n)";
var greeting = await session.ReadTransactionAsync(async tx =>
{
var result = await tx.RunAsync(sql);
return await result.ToListAsync(r => r[0].As<string>());
});
不過這次只需要關注 result.ToListAsync(r => r[0].As<string>())
這個部分就好
首先 result 的格式是 Neo4j.Driver
底下的 IRecord
而 IRecord
實際上可以視為,這個東西
Dictionary<string, object>()
所以上面這行 r => r[0].As<string>()
實際上就只是把所有回傳轉成 string
而已
所以說其他三種格式在 C# 就有對應的格式了,就直接轉過去就可以了
先丟範例,實際上長得一樣就是了
string sql = $"MATCH (n:SQL) RETURN n";
var greeting = await session.ReadTransactionAsync(async tx =>
{
var result = await tx.RunAsync(sql);
return await result.ToListAsync(r => r[0].As<INode>());
});
如果你 Cypher RETURN
的是 Node
的話
那 IRecord
轉出來的資料會是 INode
的格式,直接拆
你可以看到 INode
包含了
long
( int64 )List<string>
Dictionary<string, object>
沒錯,跟原本的 Node
格式一模一樣
看了剛剛的 INode
,IRelationship
長怎樣應該很好猜了吧
string sql = "MATCH (:SQL)-[r:have]->(:SQL) RETURN r";
var greeting = await session.ReadTransactionAsync(async tx =>
{
var result = await tx.RunAsync(sql);
return await result.ToListAsync(r => r[0].As<IRelationship>());
});
一樣直接拆開來看,可以看到它包含了
long
( int64 )long
( int64 )Dictionary<string, object>
long
( int64 )string
你可能會問:阿不是啊,你 StartNode 跟 EndNode 都只給我 Id 是能幹嘛
別急,我們往下看
請仔細注意第一行的 Cypher,這邊回傳的是所有資料
string sql = "MATCH p=(:SQL)-[:have]->(:SQL) RETURN p";
var greeting = await session.ReadTransactionAsync(async tx =>
{
var result = await tx.RunAsync(sql);
return await result.ToListAsync(r => r[0].As<IPath>());
});
你可以看到這邊的資料看起來就比較科學了(?)
INode
Dictionary<string, INode>
Dictionary<string, IRelationship>
INode
這樣的回傳資料就會包含了 Node
、Relationship
的所有內容
在後續處理,或是轉換自訂格式上就會方便許多
最後再來詳細解析一下 IRecord
吧
剛剛的範例提到的都是 Cypher 只有回傳某種特定格式的情況
那如果回傳是像這種情況呢
MATCH (n:SQL)-[r:have]->(n1:SQL) RETURN n,r,n1
那就要換一種寫法了
string sql = "MATCH (n:SQL)-[r:have]->(n1:SQL) RETURN n,r,n1";
var greeting = await session.ReadTransactionAsync(async tx =>
{
var result = await tx.RunAsync(sql);
return await result.ToListAsync();
});
foreach (var record in greeting)
{
var node = record["n"].As<INode>();
var node1 = record["n1"].As<INode>();
var relationship = record["r"].As<IRelationship>();
//Do Something
}
你回傳的資料在 ToList
之後,就會變成 List<IRecord>
,廢話
而 IRecord
剛剛有講就是 Dictionary<string, object>
那他的 key
就會是你 Cypher RETURN
的那個自訂名稱
這樣所有回傳的類型就差不多解釋完了,應該是沒漏啦 (゚∀。)
持續作弊
為什麼鐵人賽的換日時間
不跟某些手遊一樣,在凌晨五點換日阿
工程師不都熬夜加班凌晨才睡的嘛
下篇 Neo4j with C# 程式串接實作 part4 - Neo4jClient 另一個 C# 接 Neo4j 的方法
究竟鐵人賽能不能完賽呢,讓我們繼續看下去
排版好看的版本同步更新在我的 HackMD